/*
 * Empf.cpp
 *
 *      Author: Christian
 *      Letztes Update: 03.11.13 Christian | Code Aufräumen
 *
 */

#include "Empf.h"

//////////////////////////////////////////////////

volatile uint8_t counter;
volatile uint8_t empf_wert[ANZAHL_KANAELE];

//////////////////////////////////////////////////
/**
 * Setzt die Register fuer den Empfang
 *
 */
void empfaenger_init() {
	counter = 0;
	//Input catpure enable, Timer Overflow interrupt enable
	TIMSK |= (1 << TICIE1) | (1 << TOIE1);

	// Steigende Flanke, CPU-Takt/ 64
	TCCR1B |= (1 << ICES1) | (1 << CS11) | (1 << CS10);
}

/**
 * Input Capture Routine
 */
ISR( TIMER1_CAPT_vect ) {
	uint16_t x;
	int16_t tmp;

	// Wert zum Zeitpunkt des Interrupts speichern
	x = ICR1;

	// Timer reset
	TCNT1 = 0;

	tmp = (int16_t) x;
	if (counter < ANZAHL_KANAELE) {
		// Werte in Prozent umrechnen
		tmp = (x - 220) / 3 - 3;

		// Werte kleiner 0 und groeßer 100 abfangen
		if (tmp < 0) {
			tmp = 0;
		}
		if (tmp > 100) {
			tmp = 100;
		}

		// in 8 Bit Variable umwandeln
		empf_wert[counter] = (uint8_t) tmp;

#ifdef DEBUG_ENABLED
		send_buffer[counter] = empf_wert[counter];
#endif

	}

	counter++;

	// Timer synchonisiert sich selbst falls
	// die Pause zwischen zwei Interrupts groeßer 3 ms ist
	// bei Cpu-Takt / 64

	if (tmp > 600) {
		counter = 0;
	}
}

ISR( TIMER1_OVF_vect ) {
	// Timerueberlauf. Kein Empfaengersignal.

	// TODO Problembehandlung bei fehlendem Empfaengersignal

	empf_wert[0] = 50;
	empf_wert[1] = 0;
	empf_wert[2] = 50;
	empf_wert[3] = 50;
	empf_wert[4] = 0;
}
